package test.ref;

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

//注解可以看做独立的类型 用@interface  修饰

// zdy： 注解实际上是程序运行时配置参数 等待反射时抽取解析

//如果不设置@Retention 那么不会被调用
//如果不设置@Target 默认都有效
//获得注解 通过被修饰的@Target(类,方法,构造函数,参数) 的 getAnnotation 或 getAnnotations 方法获得。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@interface anno1 {
		//	注解参数的可支持数据类型：
		//
		//　　　　1.所有基本数据类型（int,float,boolean,byte,double,char,long,short)
		//　　　　2.String类型
		//　　　　3.Class类型
		//　　　　4.enum类型
		//　　　　5.Annotation类型
		//　　　　6.以上所有类型的数组
			// 注解的参数:参数类型 + 参数名 ()
	String name() default "";

	int age() default 0;

	int id();

	String[] schools() default { "清华大学", "北京大学" };
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface annoclass {
	int id();

	String msg();
}

@annoclass(id = 0, msg = "hello")
public class test {
	// 如果没有默认值，我们就必须给注解赋值
	@anno1(id = 2006)
	public void test() {
		System.out.println();
	}

	public static void main(String[] main) {
		test atest = new test();
		System.out.println("kk");
		Class<?> clazz = atest.getClass();
		// 判断类是否有注释
		if (clazz.isAnnotationPresent(annoclass.class)) {
			System.out.println("类有注解类 annoclass.class");
		}
		try {
			Annotation[] anns = clazz.getAnnotations();
			for (Annotation an : anns) {
				System.out.println("注解所在的类" + an.getClass());
				// if (an.annotationType()==anno1.class)
				// (anno1)
				System.out.println("注解的类型" + an.annotationType());
			}
			Method method = clazz.getDeclaredMethod("test");
			if (method.isAnnotationPresent(anno1.class)) {
				System.out.println("方法有注解类 anno1.class");
			}
		} catch (NoSuchMethodException | SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}